import requests
from typing import Annotated
from fastmcp import FastMCP
from pydantic import Field
from datetime import datetime
import requests
from Postgre_API.data_process import calculate_street_stats

app = FastMCP("demo")


# 定义一个名为"weather"的工具，用于查询城市天气
# 该工具接收一个字符串类型的城市名称作为参数
@app.tool(name="weather", description="城市天气查询")
def get_weather(city: str):
    # 定义一个包含部分城市天气信息的字典
    weather_data = {"北京": {"temp": 25, "condition": "晴"},
                    "上海": {"temp": 28, "condition": "多云"}
                    }
    # 返回对应城市的天气信息，如果城市不存在则返回错误信息
    return weather_data.get(city, {"error": "未找到该城市"})


# 注册股票查询工具，用于获取指定股票代码的价格信息
@app.tool(name="stock", description="股票价格查询")
def get_stock(code: str):
    # 预设的股票数据（实际应用中可替换为API调用）
    stock_data = {"600519": {"name": "贵州茅台", "price": 1825.0},
                  "000858": {"name": "五粮液", "price": 158.3}
                  }
    # 返回对应股票的信息，不存在则返回错误信息
    return stock_data.get(code, {"error": "未找到该股票"})


@app.tool(name="garbage_cleaned", description="查询指定日期全区清运干湿垃圾小区相关情况")
def query_garbage_cleaned(
    startTime: Annotated[str, Field(description="査询起始日期，格式 YYYY-MM-DD")],
    endTime: Annotated[str,Field(description="查询结束日期，格式 YYYY-MM-DD")]):
    """
    调用清运垃圾查询接口，返回不包含 code、data、message 的所有其他字段

    参数:
        startTime (str): 查询起始日期，格式 "YYYY-MM-DD"
        endTime (str): 查询结束日期，格式 "YYYY-MM-DD"

    返回:
        dict: 包含所有非 code、data、message 的字段，如：
            {
                "干垃圾清运小区Top5": [...],
                "清运小区数量": 742,
                "清运干垃圾总量": 1019548.0,
                "清运湿垃圾总量": 454202.0,
                ...
            }

        dict: 如果请求失败，返回包含 error 键的错误信息
    """
    url = "http://10.1.163.66:5000/api/cleaned-garbage-details"
    payload = {
        "startTime": startTime,
        "endTime": endTime
    }

    try:
        response = requests.post(url, json=payload, timeout=10)
        response.raise_for_status()
        data = response.json()

        if data.get("code") == 200:
            # 过滤掉 code、data、message，返回其余字段
            filtered = {
                k: v for k, v in data.items() if k not in {"code", "data", "message"}
            }
            return filtered
        else:
            return {"error": data.get("message", "接口返回异常")}

    except requests.exceptions.RequestException as e:
        return {"error": f"网络请求失败: {str(e)}"}


@app.tool(name="community_street", description="根据街道或小区名精确查询垃圾清运数据")
def query_community_street(
    startTime: Annotated[str, Field(description="査询起始日期，格式 YYYY-MM-DD HH:MM:SS，使用当天 00:00:00 作为起始时间")],
    endTime: Annotated[str,Field(description="查询结束日期，格式 YYYY-MM-DD HH:MM:SS，使用当天 23:59:59 作为结束时间")],
    street: str = None,
    community_name: str = None
):
    """
    调用 CommunityStreet 接口，返回街道/小区在指定时间范围内的垃圾清运统计数据。

    参数:
        startTime (str): 查询起始时间，格式 "YYYY-MM-DD HH:MM:SS"
        endTime (str): 查询结束时间，格式 "YYYY-MM-DD HH:MM:SS"
        street (str): 街道名
        community_name (str): 小区名

    返回:
        dict: 返回 data 字段内的信息，若失败返回 error 信息
    """
    url = "http://10.1.163.66:5000/api/CommunityStreet"
    payload = {
        "street": street,
        "community_name": community_name,
        "startTime": startTime,
        "endTime": endTime
    }
    if street:
        payload["street"] = street
    if community_name:
        payload["community_name"] = community_name

    try:
        response = requests.post(url, json=payload, timeout=10)
        response.raise_for_status()
        data = response.json()

        if data.get("code") == 200:
            # 直接返回后端的 data 字段
            # return data.get("data", {})
            filtered = {
                k: v for k, v in data.items() if k not in {"code", "data", "message"}
            }
            return filtered
        else:
            return {"error": data.get("message", "接口返回异常")}

    except requests.exceptions.RequestException as e:
        return {"error": f"网络请求失败: {str(e)}"}

if __name__ == "__main__":
    # 启动HTTP服务，支持流式响应
    app.run(
        transport="streamable-http",  # 使用支持流式传输的HTTP协议
        host="localhost",             # 监听本地地址
        port=4200,                    # 服务端口
        path="/demo",                 # 服务路径前缀
        log_level="debug",            # 调试日志级别
    )